package config

import (
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"github.com/zxmrlc/log"
)

//定义结构体Config

type Config struct {
	Name string // 配置文件的名字
}

// 读取log配置
func (c *Config) InitLog() {
	Cfg := log.PassLagerCfg{
		Writers:        viper.GetString("log.writers"),
		LoggerLevel:    viper.GetString("log.logger_level"),
		LoggerFile:     viper.GetString("log.logger_file"),
		LogFormatText:  viper.GetBool("log.log_format_text"),
		RollingPolicy:  viper.GetString("log.rollingPolicy"),
		LogRotateDate:  viper.GetInt("log.log_rotate_date"),
		LogRotateSize:  viper.GetInt("log.log_rotate_size"),
		LogBackupCount: viper.GetInt("log.log_backup_count"),
	}
	log.InitWithConfig(&Cfg)
}

//为结构体添加方法	InitConfig	--- 初始化配置文件

func (c *Config) InitConfig() error {
	if c.Name != "" {
		//如果Config实例化的时候指定了Name ，则解析指定的配置文件
		viper.SetConfigFile(c.Name)
	} else {
		//如果没有指定配置文件，则默认解析(conf/config)
		viper.AddConfigPath("conf")
		viper.SetConfigName("config")
	}
	viper.SetConfigType("yaml")
	//读取配置，发生错误就返回err
	if err := viper.ReadInConfig(); err != nil {
		return err
	}
	// 监控配置变化
	c.WatchConfig()

	// 初始化log
	c.InitLog()

	return nil
}

// 监控配置文件的变化

func (c *Config) WatchConfig() {
	viper.WatchConfig() //监控配置的变化
	//配置发生的时候做什么事情
	viper.OnConfigChange(func(e fsnotify.Event) {
		log.Infof("config file changed: %s\n", e.Name)
	})
}
